<?php

	function stripQdeep($str) {
		if (is_array($str)) {
			return array_map('stripQdeep', $str);
		} else {
			return trim(preg_replace('/[^\p{L}\p{M}\p{N}\p{P}\p{S}\p{Z}]/U', ' ', str_replace('"', "", $str)));
		}
	}
	
	function stripLineBreak($str) {
		if (is_array($str)) {
			return array_map('stripLineBreak', $str);
		} else {
			return str_replace(Array("\n", "\r"), "", $str);
		}
	}


	function schildAuth($forename, $name, $dob_day, $dob_month, $dob_year, $grade, $teacher=false)
	{
		
		if ($dob_day < 10) {
			$dob_day = "0".$dob_day;
		}
		
		if ($dob_month < 10) {
			$dob_month = "0".$dob_month;
		}
		
		$birthday = $dob_day.".".$dob_month.".".$dob_year;
		
		
		if ($teacher) {
			$file = file_get_contents(config("root")."data/teachers");
		} else {
			$file = file_get_contents(config("root")."data/students");
		}
		
		
		if ($file) {

			//$file = iconv('UTF-8', 'UTF-8//IGNORE', $file);
			
			$lines = explode("\n", $file);

			
			if ($lines) {

				$firstRow = stripLineBreak(stripQdeep(explode(";", $lines[0])));

				$forenameID = array_search("Vorname", $firstRow);
				$nameID = array_search("Nachname", $firstRow);
				$birthdayID = array_search("Geburtsdatum", $firstRow);
		
				if (!$teacher) {
					$gradeID = array_search("Jahrgang", $firstRow);
				} else {
					$gradeID = true;
				}
				
				if ($forenameID !== false AND $nameID !== false AND $birthdayID !== false AND $gradeID !== false) {

					foreach ($lines as $rowData) {
						
						$rowData = stripLineBreak(stripQdeep(explode(";", $rowData)));

						if ($teacher) {
							if ($rowData[$forenameID] == $forename AND $rowData[$nameID] == $name AND $rowData[$birthdayID] == $birthday) {
								return true;
							}
						} else {
							if ($rowData[$forenameID] == $forename AND $rowData[$nameID] == $name AND $rowData[$birthdayID] == $birthday AND $rowData[$gradeID] == $grade) {
								return true;
							}	
						}

					}

					return false;

				} else {
					error('Konnte nicht alle Spalten-IDs ermitteln!');
					return false;
				}

			} else {
				error('Keine Spalteneinträge gefunden!');
				return false;
			}

		} else {
			error('Fehler beim Auslesen der Daten!');
			return false;
		}
	
	}
	
	
	
	
	
	
	
	function show_reg()
	{
		
		
		echo '

		<h1>Registrierung für '.((isset($_GET['teacher'])?"Lehrer":"Schüler")).'</h1>

		<h2>1. Datenabgleich</h2>

		<p class="info">

			Um sicherzustellen, dass sich nur berechtigte Personen für das Funknetzwerk registrieren, werden Ihre Daten überprüft.<br />
			Bitte stellen Sie sicher, dass alle Felder exakt wie bei der Schule hinterlegt ausgefüllt sind! (2. Vorname, Akzente, ...)
			<br />
			<br />
			<i>(Hinweis: Die Daten werden nur innerhalb des Schulnetzwerks geprüft und nicht an Dritte weitergegeben!)</i>

		</p>


		<form action="index.php?f=register'.((isset($_GET['teacher'])?"&teacher=1":"")).'" method="post">


			<table class="noborder">

				<tr><th>Vorname:</th><td><input type="text" name="forename" value="'.((isset($_POST['forename']))?$_POST['forename']:"").'" /></td></tr>
				<tr><th>Nachname:</th><td><input type="text" name="name" value="'.((isset($_POST['name']))?$_POST['name']:"").'" /></td></tr>
				<tr><th>Geburtsdatum:</th><td>

				<select name="dob_day" size="1">
			      	';

						for ($i=1;$i<32;$i++) {
							echo '<option value="'.$i.'"'.((isset($_POST['dob_day']) AND $_POST['dob_day']==$i)?" selected":"").'>'.$i.'</option>';
						}

					echo '
			    </select>
				.
				<select name="dob_month" size="1">
			      	';

						for ($i=1;$i<13;$i++) {
							echo '<option value="'.$i.'"'.((isset($_POST['dob_month']) AND $_POST['dob_month']==$i)?" selected":"").'>'.$i.'</option>';
						}

					echo '
			    </select>
				.
				<select name="dob_year" size="1">
			      	';

						for ($i=date("Y")-10; $i>=date("Y")-80; $i--) {
							echo '<option value="'.$i.'"'.((isset($_POST['dob_year']) AND $_POST['dob_year']==$i)?" selected":"").'>'.$i.'</option>';
						}

					echo '
			    </select>

				</td></tr>
				';
				
				
				if (!isset($_GET['teacher'])) {
				
				echo '
				<tr><th>Jahrgangsstufe:</th><td>

				<select name="grade" size="1">
			      	';

						/* get all values for "grade" */

						$grades = Array();

						if (config("register_allowed_grades") != "") {
							$allowedGrades = explode(",", config("register_allowed_grades"));
						} else {
							$allowedGrades = Array();
						}

						
						$file = file_get_contents(config("root")."data/students");

						if ($file) {

							//$file = iconv('UTF-16', 'UTF-8', $file);

							$lines = explode("\n", $file);

							if ($lines) {

								$firstRow = stripLineBreak(stripQdeep(explode(";", $lines[0])));

								$gradeID = array_search("Jahrgang", $firstRow);
								
								if ($gradeID !== false) {

									foreach ($lines as $rowData) {

										$rowData = stripLineBreak(stripQdeep(explode(";", $rowData)));

										if (array_search($rowData[$gradeID], $allowedGrades) !== false AND array_search($rowData[$gradeID], $grades) === false) {
											
											$grades[] = $rowData[$gradeID];
											
										}

									}

								} else {
									die('</select>ERROR: Grades - Spalten ID nicht gefunden!');
									return false;
								}
								
								
							} else {
								die('</select>ERROR: Grades - Keine Spalteneinträge gefunden!');
							}

						} else {
							die('</select>ERROR: Grades - Fehler beim Auslesen der Daten!');
						}

						foreach ($grades as $grade) {
							echo '<option value="'.$grade.'"'.((isset($_POST['grade']) AND $_POST['grade']==$grade)?" selected":"").'>'.$grade.'</option>';
						}

					echo '
			    </select>

				</td></tr>
				';
				
				}
				
				echo '

			</table>


			<br />


			<h2>2: Zugangsdaten wählen</h2>

			<p class="info">

				Bitte geben Sie einen Benutzernamen, ein <strong>sicheres Passwort</strong>, sowie eine gültige E-Mail Adresse an.<br />
				Benutzername und Passwort benötigen Sie später, um sich am Funknetzwerk anzumelden.<br />
				Die E-Mail Adresse wird benötigt, um Sie über die Einrichtung Ihres Zugangs zu benachrichtigen, oder ein vergessenes Passwort wiederherzustellen.
				<br />
				<br />
				<i>(Hinweis: Sollten Sie nicht über eine E-Mail Adresse verfügen, können Sie z.B. hier eine kostenlose Adresse anlegen: <a href="http://mail.google.com/mail/?hl=de" target="_blank">Google Mail</a>)</i>

			<p>

				<table class="noborder">

					<tr><th>Benutzername:</th><td><input type="text" name="username" value="'.((isset($_POST['username']))?$_POST['username']:"").'" /> <i>(Erlaubte Zeichen sind Buchstaben, Zahlen, Unterstriche, Punkte und Bindestriche. Keine Umlaute!)</i></td></tr>

					<tr><th>E-Mail Adresse:</th><td><input type="text" name="email" value="'.((isset($_POST['email']))?$_POST['email']:"").'" /></td></tr>

					<tr><th>Passwort:</th><td><input type="password" name="password" value="'.((isset($_POST['password']))?$_POST['password']:"").'" /></td></tr>
					<tr><th>Passwort wiederholen:</th><td><input type="password" name="password2" value="'.((isset($_POST['password2']))?$_POST['password2']:"").'" /></td></tr>

					<tr><th></th><td><input type="submit" name="reg" value="Registrieren" /></td></tr>

				</table>


		</form>

		';
		
	}
	
	
	
	function checkUsername($username)
	{
		
		if ($username == preg_replace('@[^a-zA-Z0-9\_\.\-]@is', '', $username)) {
			return true;
		} else {
			return false;
		}
		
	}
	
	
	
	function usernameIsUnused($username)
	{
		
		if (file_exists(config("root")."data/users.xml")) {

			$xmlObj = simplexml_load_file(config("root")."data/users.xml");

			$usersObj = $xmlObj->xpath("user/username[text()='".strtolower($username)."']/..");
			
			if ($usersObj) {
				return false;
			} else {
				return true;
			}
		
		} else error("Benutzerliste nicht gefunden. Bitte versuchen Sie es später noch einmal.");
		
	}
	
	
	function newRegcode()
	{
		
		srand ((double)microtime()*1000000); 
		$valid_chars = "ABCDEFGHIJKLMNPQRSTUVWXYZ123456789"; 
		$code = ''; 
		$length = 4; 

		while($length > 0) { 
    		$code .= $valid_chars[rand(0,strlen($valid_chars)-1)]; 
    		$length--; 
		}

		return $code;
		
	}
	
	
	
	
	if (isset($_POST['forename'])) {
	
		if (isset($_GET['teacher'])) {
			$auth = schildAuth($_POST['forename'], $_POST['name'], $_POST['dob_day'], $_POST['dob_month'], $_POST['dob_year'], 0, true);
		} else {
			$auth = schildAuth($_POST['forename'], $_POST['name'], $_POST['dob_day'], $_POST['dob_month'], $_POST['dob_year'], $_POST['grade'], false);
		}
	
		if ($auth) {
			
			if (trim($_POST['password']) != "") {
			
				if ($_POST['password'] == $_POST['password2']) {

					if (strpos($_POST['email'], '@') !== false) {

						if (checkUsername($_POST['username'])) {

							if (usernameIsUnused($_POST['username'])) {

								/* add user to xml-file */

								if (file_exists(config("root")."data/users.xml")) {

									$xmlObj = simplexml_load_file(config("root")."data/users.xml");

										/* get next id */

										$newId = 0;

										$idsObj = $xmlObj->xpath("user");

										if ($idsObj) {

											foreach ($idsObj as $idObj) {

												if ($idObj->id > $newId) {
													$newId = (int) $idObj->id;
												}

											}

										}

										$newId++;

										/* generate new reg-code */

										$regcode = newRegcode();

										//generate new regcode, if regcode is already in use
										while ($xmlObj->xpath("user/regcode[text()='".$regcode."']/..")) {
											$regcode = newRegcode();
										}

										$newXmlString = '
											<user>
												<id>'.$newId.'</id>
												<regcode>'.$regcode.'</regcode>
												<username>'.xmlencode(strtolower($_POST['username'])).'</username>
												<password>'.xmlencode($_POST['password']).'</password>
												<forename>'.xmlencode($_POST['forename']).'</forename>
												<name>'.xmlencode($_POST['name']).'</name>
												<dateofbirth>'.xmlencode($_POST['dob_year']).'-'.xmlencode($_POST['dob_month']).'-'.xmlencode($_POST['dob_day']).'</dateofbirth>
												<email>'.xmlencode($_POST['email']).'</email>
												<regdate>'.time().'</regdate>
												<position>'.((isset($_GET['teacher'])?"Lehrer":"Schüler")).'</position>
												<active>0</active>
												<locked>0</locked>
											</user>
										';

										$usersXmlString = file_get_contents(config("root")."data/users.xml");

										$usersXmlString = substr($usersXmlString, 0, strpos($usersXmlString, "<users>")+7).$newXmlString.substr($usersXmlString, strpos($usersXmlString, "<users>")+7);

										$save = file_put_contents(config("root")."data/users.xml", $usersXmlString);

										if ($save) {

											/* user successfully added */

											echo '

												<h1>Registrierung erfolgreich!</h1>

												<div class="info">

													<h1>Wichtig!</h1>

													<p>Um die Registrierung abzuschließen, müssen Sie das Anmeldeformular ausfüllen, unterschreiben und den unten stehenden Registrierungcode eintragen.</p>

													<p><strong>Registrierungen werden erst nach Eintreffen des Anmeldeformulars bearbeitet!</strong></p>

													<p>Sobald Ihr Benutzer für das Funknetzwerk angelegt wurde, erhalten Sie eine E-Mail von uns mit allen weiteren Informationen.<br />
													Dort wird dann auch genau beschrieben, wie Sie Ihr Gerät einrichten müssen.</p>

													<p>Bei Fragen wenden Sie sich bitte an: '.config("ADMIN_MAIL").'</p>

												</div> 

												<div class="code">
													<strong>Registrierungcode:</strong><br />
													<span>'.$regcode.'</span>
												</div>

											';

										} else {
											error("Fehler beim Speichern der XML-Datei. Bitte versuchen Sie es später noch einmal.");
											show_reg();
										}

								} else {
									error("Benutzerliste nicht gefunden. Bitte versuchen Sie es später noch einmal.");
									show_reg();
								}

							} else {
								error("Dieser Benutzername ist leider schon vergeben!");
								show_reg();
							}

						} else {
							error("Der Benutzername enthält ungültige Zeichen!");
							show_reg();
						}

					} else {
						error("Die angegebene E-Mail Adresse ist nicht gültig!");
						show_reg();
					}

				} else {
					error('Die Felder "Passwort" und "Password wiederholen" stimmen nicht überein!');
					show_reg();
				}
				
			} else {
				error('Bitte geben Sie ein Passwort an!');
				show_reg();
			}
			
		} else {
			error("Fehler beim Datenabgleich.<br />Bitte stellen Sie sicher, dass die Daten exakt wie bei der Schule hinterlegt angegeben sind.");
			show_reg();
		}
	
	} else {
		show_reg();
	}
	
	
	
	



?>
